{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "e382ee48",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "initial-dataset的大小 62400\n",
      "encription-dataset的大小 62400\n",
      "decription-dataset的大小 62400\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "from torchvision import datasets, transforms\n",
    "import os\n",
    "\n",
    "if os.path.exists('initial_dataset.pt') and os.path.exists('encription_dataset.pt') and os.path.exists('decription_dataset.pt'):\n",
    "    initial_dataset = torch.load('initial_dataset.pt')\n",
    "    encription_dataset = torch.load('encription_dataset.pt')\n",
    "    decription_dataset = torch.load('decription_dataset.pt')\n",
    "else:\n",
    "    # 下载和处理数据集的代码\n",
    "    # 下载EMNIST数据集\n",
    "    emnist_dataset = datasets.EMNIST(\n",
    "        root='./data',\n",
    "        split='balanced',\n",
    "        train=True,\n",
    "        download=False,  # 关闭自动下载\n",
    "        transform=transforms.ToTensor()\n",
    "    )\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "    # EMNIST balanced子集26个字母标签到新标签的映射\n",
    "    letter_labels = [10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,1,3,5,7,9,11,13]\n",
    "    label_map = {old_label: new_label for new_label, old_label in enumerate(letter_labels)}\n",
    "\n",
    "    # 筛选并映射\n",
    "    filtered_dataset = []\n",
    "    for img, label in emnist_dataset:\n",
    "        if label in label_map:\n",
    "            filtered_dataset.append((img, label_map[label]))\n",
    "\n",
    "    print(\"筛选后字母样本数：\", len(filtered_dataset))\n",
    "\n",
    "\n",
    "    # 处理图片，生成initial-dataset\n",
    "    initial_dataset = []\n",
    "    for img, label in filtered_dataset:\n",
    "        img_tensor = img.squeeze().clone()\n",
    "        A_mask = img_tensor > 0.5\n",
    "        B_mask = img_tensor <= 0.5\n",
    "        # 标记A类为1，B类为2，其他为0\n",
    "        class_map = torch.zeros_like(img_tensor, dtype=torch.uint8)\n",
    "        class_map[A_mask] = 1\n",
    "        class_map[B_mask] = 0\n",
    "        initial_dataset.append((class_map, label))\n",
    "\n",
    "    # 生成encription-dataset\n",
    "    encription_dataset = []\n",
    "    for class_map, label in initial_dataset:\n",
    "        img_enc = torch.zeros_like(class_map, dtype=torch.float32)\n",
    "        img_enc[class_map == 1] = 204/255.0\n",
    "        img_enc[class_map == 0] = 220/255.0\n",
    "        encription_dataset.append((img_enc, label))\n",
    "\n",
    "    # 生成decription-dataset\n",
    "    decription_dataset = []\n",
    "    for class_map, label in initial_dataset:\n",
    "        img_dec = torch.zeros_like(class_map, dtype=torch.float32)\n",
    "        img_dec[class_map == 1] = 175/255.0\n",
    "        img_dec[class_map == 0] = 51/255.0\n",
    "        decription_dataset.append((img_dec, label))\n",
    "\n",
    "\n",
    "\n",
    "    # 保存数据集\n",
    "    torch.save(initial_dataset, 'initial_dataset.pt')\n",
    "    torch.save(encription_dataset, 'encription_dataset.pt')\n",
    "    torch.save(decription_dataset, 'decription_dataset.pt')\n",
    "\n",
    "print(\"initial-dataset的大小\", len(initial_dataset))\n",
    "print(\"encription-dataset的大小\", len(encription_dataset))\n",
    "print(\"decription-dataset的大小\", len(decription_dataset))\n",
    "\n",
    "    \n",
    "    \n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "a00939dd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "initial-dataset 样本数： 62400\n"
     ]
    }
   ],
   "source": [
    "print(\"initial-dataset 样本数：\", len(initial_dataset))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "df24503c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第一张图片的形状： torch.Size([28, 28])\n"
     ]
    }
   ],
   "source": [
    "img, label = initial_dataset[0]\n",
    "print(\"第一张图片的形状：\", img.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f6001d77",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "e:\\Users\\ASUS\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 26631 (\\N{CJK UNIFIED IDEOGRAPH-6807}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "e:\\Users\\ASUS\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 31614 (\\N{CJK UNIFIED IDEOGRAPH-7B7E}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "img, label = initial_dataset[0]\n",
    "plt.imshow(img.numpy(), cmap='gray')\n",
    "plt.title(f\"标签: {label}\")\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "003ff650",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initial Dataset 前十张图片及标签：\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ4AAADWCAYAAACQV0j4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAHsNJREFUeJzt3XuQVuV9B/DfcluWRYEsF0WjELwABlCxdovh4jirggTEsRlDHUWDVgcrXjrWIRgBbzVWhbSiiNS1E201SG2DkGkjolWXWBtFKzHGC8bEVBMBgwSBwukfiVvuvCz7vOfddz+fmZ2Bw3v5nfOc55x3vzzP81ZkWZYFAAAAADSzNnkXAAAAAEB5EjwBAAAAkITgCQAAAIAkBE8AAAAAJCF4AgAAACAJwRMAAAAASQieAAAAAEhC8AQAAABAEoInAAAAAJIQPAFAK1dfXx8VFRXx0ksvNen5FRUVMWPGjMa/r1q1KmbMmBGrV6/e5bGTJk2KPn36NOl9Cn3upEmToqKiovGnuro6+vTpE+PGjYsHH3wwNm3a1KT3j4hYsmTJDvuat0ceeSRmz56ddxkAAHskeAIADkhDQ0NMnjy58e+rVq2KmTNn7jZ4uuGGG+Kf//mfk9dUVVUVDQ0N0dDQEIsXL45Zs2ZFdXV1XHLJJTF06ND4xS9+0aTXXbJkScycObOZq206wRMAUOra5V0AANCy1dbWFvzYfv36Jazk/7Vp02aXui644IK46KKLYuzYsXHuuefGihUrilILAEBrZsQTALCLSZMmRefOneOtt96KMWPGROfOneOLX/xiXHvttbtMVdt+ql19fX386Z/+aUREnHrqqY3T3err6xtfd+fpcvfcc0+MGDEievbsGdXV1TFo0KD49re/HVu2bGn2/Tr99NPjkksuiR/96Efx7LPPNm5/9NFH4/TTT49DDz00qqqqYsCAAXH99dfHhg0bdjgm99xzT+M+f/7z+ciuQvfj5ZdfjrFjx0bPnj2jsrIyevfuHWedddYOo7CyLIu5c+fG8ccfH1VVVdGtW7c499xz45133ml8zKhRo+LJJ5+M9957b4d6AABKiRFPAMBubdmyJcaNGxff+MY34tprr41nn302brrppujSpUt861vf2u1zzjrrrLj11ltj2rRpcc8998SJJ54YEXsf6fT222/HxIkTo2/fvtGhQ4dYuXJl3HLLLfHGG2/E3//93zf7fo0bNy7mzp0bzz77bIwYMSIiIn72s5/FmDFj4qqrrorq6up444034vbbb48XX3wxli1bFhG/nya4YcOGWLhwYTQ0NDS+3qGHHlrwfmzYsCHq6uqib9++cc8990SvXr3if/7nf+Lpp5+O9evXN77mn//5n0d9fX1ceeWVcfvtt8eaNWti1qxZMWzYsFi5cmX06tUr5s6dG5deemm8/fbbRZm+CADQFIInAGC3Nm/eHDNnzmwcwXTaaafFSy+9FI888sgeg6cePXrE0UcfHRERAwcOLGga3l133dX4523btsXw4cOjpqYmLrroorjzzjujW7duzbA3/+/II4+MiIgPPvigcdv06dMb/5xlWZxyyikxYMCAGDlyZLz66qsxePDg6NevX/Tq1Ssidj+9sJD9eOONN+Ljjz+OBQsWxPjx4xsf/7Wvfa3xzytWrIj58+fHnXfeGddcc03j9uHDh8cxxxwTd911V9x+++0xcODA6Nq1a1RWVu7XdEcAgGIy1Q4A2K2Kior46le/usO2wYMHx3vvvdes7/Pyyy/HuHHjoqamJtq2bRvt27ePCy64ILZu3Rpvvvlms75XxO+DpZ298847MXHixDjkkEMaaxg5cmRERPzkJz8p6HUL2Y+jjjoqunXrFn/1V38V9913X6xatWqX11m8eHFUVFTE+eefH//7v//b+HPIIYfEkCFDYvny5U3feQCAIjPiCQDYrU6dOkXHjh132FZZWRmfffZZs73Hz3/+8xg+fHgce+yxMWfOnOjTp0907NgxXnzxxZgyZUps3Lix2d7rc58HZ717946IiE8//TSGDx8eHTt2jJtvvjmOOeaY6NSpU7z//vtxzjnnFFRDofvRpUuXeOaZZ+KWW26JadOmxdq1a+PQQw+NSy65JKZPnx7t27ePDz/8MLIsaxxdtbMvfelLzXQkAADSEzwBALl54oknYsOGDbFo0aLGKXAREa+88kqy9/zXf/3XiPj94twREcuWLYsPPvggli9f3jjKKSJi3bp1Bb/m/uzHoEGD4p/+6Z8iy7J49dVXo76+PmbNmhVVVVVx/fXXR/fu3aOioiL+4z/+IyorK3d5/u62AQCUKsETANCsPg9GChkp9Pm3sG0fpmRZFvPnz09S27//+7/HAw88EMOGDYuvfOUre6whImLevHm7PH/7fauqqmrc3pT9qKioiCFDhsTdd98d9fX18eMf/zgiIsaOHRt//dd/Hb/85S93WPtpdyorK5OMCgMAaC6CJwCgWX35y1+OiIj7778/DjrooOjYsWP07ds3ampqdnlsXV1ddOjQIb7+9a/HddddF5999lnce++9sXbt2gOqYdu2bbFixYqIiNi0aVP8/Oc/j6VLl8Zjjz0WAwYMiMcee6zxscOGDYtu3brFZZddFjfeeGO0b98+Hn744Vi5cuUurzto0KCIiLj99ttj9OjR0bZt2xg8eHDB+7F48eKYO3dunH322fGlL30psiyLRYsWxbp166Kuri4iIk455ZS49NJL46KLLoqXXnopRowYEdXV1fGrX/0qnnvuuRg0aFBcfvnljfUsWrQo7r333hg6dGi0adMmTjrppAM6dgAAzUnwBAA0q759+8bs2bNjzpw5MWrUqNi6dWs8+OCDMWnSpF0e279//3j88cdj+vTpcc4550RNTU1MnDgxrrnmmhg9enSTa9i4cWP8yZ/8SUREVFVVRY8ePWLIkCExf/78+LM/+7Po0KFD42NramriySefjGuvvTbOP//8qK6ujvHjx8ejjz4aJ5544g6vO3HixHj++edj7ty5MWvWrMiyLN59992C9+Poo4+Orl27xre//e344IMPokOHDnHsscdGfX19XHjhhY2PmzdvXtTW1sa8efNi7ty5sW3btujdu3eccsopcfLJJzc+burUqfH666/HtGnT4pNPPoksy3a7eDoAQF4qMp9OAAAAAEigTd4FAAAAAFCeBE8AAAAAJCF4AgAAACAJwRMAAAAASQieAAAAAEhC8AQAAABAEoInAAAAAJIQPAEAAACQhOAJAAAAgCQETwAAAAAkIXgCAAAAIAnBEwAAAABJCJ4AAAAASELwBAAAAEASgicAAAAAkhA8AQAAAJCE4AkAAACAJARPAAAAACQheAIAAAAgCcETAAAAAEkIngAAAABIQvAEAAAAQBKCJwAAAACSEDwBAAAAkITgCQAAAIAkBE8AAAAAJCF4AgAAACAJwRMAAAAASQieAAAAAEhC8AQAAABAEoInAAAAAJIQPAEAAACQhOAJAAAAgCQETwAAAAAkIXgCAAAAIAnBEwAAAABJCJ4AAAAASELwBAAAAEASgicAAAAAkhA8AQAAAJCE4AkAAACAJARPAAAAACQheAIAAAAgCcETAAAAAEkIngAAAABIQvAEAAAAQBKCJwAAAACSEDwBAAAAkITgCQAAAIAkBE8AAAAAJCF4AgAAACAJwRMAAAAASQieAAAAAEhC8AQAAABAEoInAAAAAJIQPAEAAACQhOAJAAAAgCQETwAAAAAkIXgCAAAAIAnBEwAAAABJCJ4AAAAASELwBAAAAEASgicAAAAAkiir4Gn9+vVx3XXXxemnnx49evSIioqKmDFjxi6P+853vhO1tbXRvXv3qKysjCOOOCLOO++8eP3114tfNPtUaLtGRGzZsiXuuuuuGDRoUFRVVUXXrl1j2LBh8cILLxS3aJrs5ZdfjrPPPjt69+4dnTp1iv79+8esWbPid7/7Xd6lUYBC++tzzz0XkydPjqFDh0ZlZWVUVFTE6tWri14vTbd8+fKoqKjY7c+KFSvyLo8CFdpnsyyL73znO9G/f/+orKyMQw89NC6//PJYu3Zt8Ytmn/anXefPnx9Dhw6Ngw8+OGpqamLkyJHx5JNPFr9o9mrZsmVx8cUXR//+/aO6ujoOO+ywGD9+fPzXf/3XDo+bNGnSbq/L/fv3z6lymmJP7eg+2/Ltz++25aSsgqePP/447r///ti0aVOcffbZe33c6NGj44EHHoh/+7d/i5kzZ8bLL78cf/zHfxw//elPi1cwBSm0Xbdu3RoTJkyIWbNmxde//vVYunRpPPzww3HmmWfGhg0bilcwTbZq1aoYNmxYrF69OmbPnh2LFy+O8847r7FNKX2F9tennnoqfvjDH8YRRxwRw4YNK16BNLtbb701Ghoadvj58pe/nHdZFKjQPvuXf/mXcfXVV8f48eNj8eLFcf3118cjjzwSdXV1sWXLluIVTEEKbdcbb7wxLr300jj55JPj8ccfj/r6+qisrIyxY8fGokWLilcw+3TvvffG6tWrY+rUqbFkyZKYM2dOfPTRR1FbWxvLli3b4bFVVVW7XJcfffTRnCqnKW644YZd2rChoSG6d+8ehx12WPzRH/1R3iXSRIVen8tOVka2bduWbdu2LcuyLPv1r3+dRUR24403FvTcVatWZRGR3XDDDQkrpCkKbde77747a9OmTdbQ0FDkCmku3/zmN7OIyN56660dtl966aVZRGRr1qzJqTIKVWh/3bp1a+Of77jjjiwisnfffbdIVdIcnn766Swisu9973t5l8IBKKTP/uIXv8jatm2b/cVf/MUO2x955JEsIrL777+/WOVSoEKvxYcddlj2la98ZYdtGzduzLp06ZKNGzeuGKVSoA8//HCXbevXr8969eqVnXbaaY3bLrzwwqy6urqYpVEky5cvzyIimz59et6lcAAOJLNoycpqxNPnQw+bokePHhER0a5du+YsiWZQaLvOmTMnRowYEbW1tUWoihTat28fERFdunTZYXvXrl2jTZs20aFDhzzKYj8U2l/btCmr2w+0WIX02RUrVsTWrVtjzJgxO2wfO3ZsREQ8/vjjyeqjaQq9Frdv336Xe27Hjh0bfygdPXv23GVb586dY+DAgfH+++/nUBHFtmDBgqioqIiLL74471I4AAeSWbRkrfqT/9atW2PTpk3xxhtvxOTJk6Nnz55x0UUX5V0WTfD+++/H6tWrY9CgQTFt2rTo1atXtGvXLo477rh46KGH8i6PAl144YXRtWvXuPzyy+Odd96J9evXx+LFi2PevHkxZcqUqK6uzrtEYCdTpkyJdu3axcEHHxxnnHFGPPfcc3mXRDPbvHlzRERUVlbusL19+/ZRUVERr776ah5l0QymTp0aP/jBD2LBggWxdu3a+NWvfhXXXHNNfPLJJ3HllVfmXR778Mknn8SPf/zjOO6443bYvnHjxjjkkEOibdu2cfjhh8cVV1wRa9asyalKmsMnn3wSCxcujNNOOy369u2bdzmw31r18J7q6urYtGlTREQcc8wxsXz58vjiF7+Yc1U0xS9/+cuIiHjooYfi8MMPj7/7u7+LLl26xPz582PSpEmxefPmuOSSS3Kukn3p06dPNDQ0xIQJE6Jfv36N26+88sqYPXt2foUBu+jSpUtMnTo1Ro0aFTU1NfHWW2/FHXfcEaNGjYonn3wyzjjjjLxLpJkMHDgwIiKef/75OPXUUxu3v/DCC5FlWXz88cd5lcYBuuqqq6KqqiqmTJkSkydPjoiIL3zhC/H9738/TjnllJyrY1+mTJkSGzZsiG9+85uN24YMGRJDhgxpXGvvmWeeibvvvjueeuqp+M///M/o3LlzXuVyAP7xH/8xNm7cGN/4xjfyLgWapFUHTy+88EJs3rw53n777bj77rvj1FNPjaeeemqX/zWg9G3bti0iIj777LNYsmRJHHnkkRERUVdXFyeddFLMmjVL8NQCrF69Or761a9Gr169YuHChdGjR4/40Y9+FDfffHN8+umnsWDBgrxLBP7ghBNOiBNOOKHx78OHD48JEybEoEGD4rrrrhM8lZEhQ4bEiBEj4o477ohjjz026urqYtWqVXHZZZdF27ZtTZ1twR588MGYOnVqXHHFFTF69OjYvHlz/MM//EOMHz8+Fi1apB+XsBtuuCEefvjh+Nu//dsYOnRo4/arr756h8fV1dXFCSecEOeee27Mnz9/l3+nZViwYEHU1NTEhAkT8i4FmqRVB08nnnhiRETU1tbGuHHj4qijjopp06bFv/zLv+RcGfurpqYmIiL69+/fGDpF/H4O7RlnnBG33XZbfPTRR7udH0/puP766+O3v/1tvPLKK43T6kaMGBHdu3ePiy++OC644IIYOXJkzlUCe9K1a9cYO3Zs3HfffbFx48aoqqrKuySayfe+972YNGlSfO1rX4uIiA4dOsTVV18dP/zhD2PdunX5FkeTrF27tnGk09/8zd80bh89enSMGjUqLrvssnj33XdzrJA9mTlzZtx8881xyy23xBVXXLHPx0+YMCGqq6tjxYoVRaiO5vbqq6/GSy+9FFOnTt1lyjO0FP6L6g8OOuig6N+/f7z55pt5l0IT9OvXLzp16rTbf8uyLCIsZtwSvPLKKzFw4MBd1nL6/Ctj//u//zuPsoD98Pk1tzUunFnOevbsGUuWLIkPP/wwVq5cGR999FHMmjUr3nzzzRgxYkTe5dEEP/3pT2Pjxo27/Vr2k046KVavXh2ffvppDpWxNzNnzowZM2bEjBkzYtq0aQU/L8syn4VbqM9H/H8+HRZaIlefP/jNb34Tr732Whx11FF5l0ITtGvXLsaPHx8/+clPYvXq1Y3bsyyLH/zgB9GvX7/o3r17fgVSkN69e8frr7++ywfdhoaGiIg4/PDD8ygLKNDatWtj8eLFcfzxx/tGrDLVs2fPGDx4cHTp0iXuu+++2LBhQ0EjLig9vXv3jojYZRRMlmWxYsWK6Natmy/1KDE33XRTzJgxI6ZPnx433nhjwc9buHBh/O53v/PNzy3Qpk2b4rvf/W6cfPLJjet2QUtUdlPtli5dGhs2bIj169dHRMSqVati4cKFERExZsyY2LJlS9TV1cXEiRPj6KOPjqqqqnjzzTdjzpw5sWnTpv26iFM8+2rXTp06xU033RRLly6NM888M2bMmBEHH3xwPPDAA7Fy5cp47LHH8iyfAl111VVx9tlnR11dXVx99dXRvXv3WLFiRdx2220xcODAGD16dN4lUoBC+uuvf/3reOaZZyIi4rXXXmt8Xo8ePaJHjx6mVLYAEydOjCOOOCJOOumk6N69e/zsZz+LO++8Mz788MOor6/Puzz2QyF9dv78+RHx+xHG69ati6VLl8aCBQvi1ltvbVy6gNKyr3Y94ogj4pxzzon7778/KisrY8yYMbFp06Z46KGH4vnnn4+bbrrJyMUScuedd8a3vvWtOPPMM+Oss87aJTCsra2N9957LyZOnBjnnXdeHHXUUVFRURHPPPNMzJ49O4477jgjZlqgJ554ItasWaPtykwh992yk5WZI488MouI3f68++672WeffZZNnjw5GzBgQNa5c+esXbt22eGHH56df/752euvv553+ezBvtr1c6+99lp21llnZQcddFDWsWPHrLa2Nvv+97+fX+Hst2XLlmWnn356dsghh2RVVVXZMccck1177bXZb37zm7xLo0CF9Nenn356j48ZOXJkrvVTmNtuuy07/vjjsy5dumRt27bNevTokU2YMCF78cUX8y6N/VRIn503b142YMCArFOnTlnnzp2z4cOHZ0888US+hbNXhbTrxo0bszvuuCMbPHhwdtBBB2Vf+MIXstra2uy73/1utm3btnx3gB2MHDlyj+35+a90a9asySZMmJD16dMnq6qqyjp06JAdffTR2XXXXZetW7cu5z2gKerq6rLq6urst7/9bd6l0IwK/d22nFRk2R8WYwAAAACAZmSNJwAAAACSEDwBAAAAkITgCQAAAIAkBE8AAAAAJCF4AgAAACAJwRMAAAAASbQr9IEVFRUp62A/ZFnWbK+lXUuHdi1PzdmuEdq2lOiz5Um7liftWp7cY8uXPluetGt5KqRdjXgCAAAAIAnBEwAAAABJCJ4AAAAASELwBAAAAEASgicAAAAAkhA8AQAAAJCE4AkAAACAJARPAAAAACQheAIAAAAgCcETAAAAAEm0y7sAANiTLMv2+G8VFRVFrIRi2Vub743zAQCgNBnxBAAAAEASgicAAAAAkjDVDoCCNXUaVArFqMX0rcKV0rkBAFDqWtNnWSOeAAAAAEhC8AQAAABAEoInAAAAAJKwxhNQVCnmMpfK3GX2rJTayFpETZf3sSul8whKQXP1SX0LoDiK/Vlq5/fL63pvxBMA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",
      "text/plain": [
       "<Figure size 1500x300 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Encription Dataset 前十张图片及标签：\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ4AAADWCAYAAACQV0j4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAIqRJREFUeJzt3Xl0VeW5P/AnBAhhEC4Jg4BAxQFFRIWr6JVBLQ6gIHZYwLoLFZFbl7Zo7WVZHBi0slpbFVtHirO2VrSITMulKLUKFW/VOlS9KsHqFVBApRCBhv37oyU/YhhOQnbOSfL5rHXWkp19dp6z3/3uc/L1fd+TlyRJEgAAAABQwxpluwAAAAAA6ifBEwAAAACpEDwBAAAAkArBEwAAAACpEDwBAAAAkArBEwAAAACpEDwBAAAAkArBEwAAAACpEDwBAAAAkArBEwDUQffee2/k5eXt9vHcc89lraaSkpIqP3fz5s0xderUXda9L8fdV4MHDy4/p40aNYpWrVrFQQcdFN/5zndizpw5sX379mof++GHH46bb7655ordR7fddlvce++92S4DAKhnGme7AACg+u65557o2bNnpe2HH354rdcybNiwWLZsWey///5Vfu7mzZtj2rRpEfHPsKemjlsTDjzwwHjooYciImLTpk2xcuXKmDt3bnznO9+JAQMGxJNPPhmtW7eu8nEffvjheOONN+LSSy+t4Yqr57bbbovi4uI477zzsl0KAFCPCJ4AoA474ogjol+/flmtobS0NJo1axbt2rWLdu3a1fjx0zpupgoLC6N///4Vto0fPz7uueeeGDduXEyYMCEeeeSRLFUHAJDbTLUDgHouLy8vLrnkknjggQfisMMOi+bNm0efPn1i/vz5lfZ9++23Y/To0dGhQ4coKCiIrl27xtixY2PLli0R8f+nvT311FMxbty4aNeuXTRv3jy2bNmyyylxgwcPjiOOOCKef/756N+/fxQWFkbnzp3j6quvjrKysoiIKCkpKQ+Wpk2bVj61bcfIm91Ntbv77rujT58+0axZs2jbtm2MHDky/vrXv1bY57zzzouWLVvGe++9F0OHDo2WLVvGAQccEJdffnn5a6qu888/P4YOHRqPPvporFq1qnz7rbfeGgMHDoz27dtHixYtonfv3vGzn/0stm3bVuG8LFiwIFatWlVhiuQO06ZNi+OOOy7atm0b++23XxxzzDExe/bsSJKkQg1LliyJwYMHR1FRURQWFkbXrl3jW9/6VmzevLl8n61bt8Z1110XPXv2jIKCgmjXrl2cf/758emnn5bv071793jzzTdj6dKl5bV07959n84PAECEEU8AUKeVlZXFP/7xjwrb8vLyIj8/v8K2BQsWxIoVK2L69OnRsmXL+NnPfhYjR46Md955Jw488MCIiHjttdfixBNPjOLi4pg+fXocfPDB8cknn8S8efNi69atUVBQUH68cePGxbBhw+KBBx6ITZs2RZMmTXZb4+rVq2PUqFFxxRVXxPTp02PBggVx3XXXxYYNG+JXv/pV7L///rF48eI4/fTT44ILLojx48dHROxxlNOMGTNi8uTJMXr06JgxY0asW7cupk6dGscff3ysWLEiDj744PJ9t23bFsOHD48LLrggLr/88vjDH/4Q1157bbRu3TquueaazE/2LgwfPjwWLlwYzz//fHTr1i0iIt5///0YM2ZMfOMb34imTZvGa6+9Fj/5yU/i7bffjrvvvjsi/jmtbcKECfH+++/H73//+0rHLSkpif/6r/+Krl27RkTE8uXL4/vf/358/PHH5TWXlJTEsGHDYsCAAXH33XdHmzZt4uOPP47FixfH1q1bo3nz5rF9+/YYMWJEPP/88zFp0qQ44YQTYtWqVTFlypQYPHhwvPzyy1FYWBi///3v49vf/na0bt06brvttoiICu0NAFBtCQBQ59xzzz1JROzykZ+fX2HfiEg6dOiQfPnll+XbVq9enTRq1CiZMWNG+baTTz45adOmTbJ27dq9/t6xY8fu9mcrV64s3zZo0KAkIpInnniiwr4XXnhh0qhRo2TVqlVJkiTJp59+mkREMmXKlL0ed8OGDUlhYWEydOjQCvt9+OGHSUFBQTJmzJjybeeee24SEcnvfve7CvsOHTo0OfTQQ3f7Oneuv1evXrv9+aJFi5KISH7605/u8udlZWXJtm3bkvvvvz/Jz89P1q9fX/6zYcOGJd26ddtrDTuOMX369KSoqCjZvn17kiRJMmfOnCQikldffXW3z/3Nb36TRETy2GOPVdi+YsWKJCKS2267rXxbr169kkGDBu21HgCAqjDVDgDqsPvvvz9WrFhR4fGnP/2p0n4nnXRStGrVqvzfHTp0iPbt25dPEdu8eXMsXbo0vvvd72a0ntK3vvWtjGts1apVDB8+vMK2MWPGxPbt2+MPf/hDxsfZYdmyZVFaWlppEewDDjggTj755HjmmWcqbM/Ly4uzzjqrwrYjjzyywvS46kq+NvUtIuKVV16J4cOHR1FRUeTn50eTJk1i7NixUVZWFu+++25Gx12yZEl885vfjNatW5cf45prrol169bF2rVrIyLiqKOOiqZNm8aECRPivvvuiw8++KDScebPnx9t2rSJs846K/7xj3+UP4466qjo2LFjVr79EABoWARPAFCHHXbYYdGvX78Kj759+1bar6ioqNK2goKCKC0tjYiIDRs2RFlZWXTp0iWj31uVb5jr0KFDpW0dO3aMiIh169ZlfJwddjxnVzV06tSp0jGbN28ezZo1q7CtoKAgvvrqqyr/7q/bEV516tQpIiI+/PDDGDBgQHz88ccxc+bMeP7552PFihVx6623RkSUn+89eemll+LUU0+NiIhZs2bFCy+8ECtWrIgrr7yywjF69OgRTz/9dLRv3z4uvvji6NGjR/To0SNmzpxZfqw1a9bE559/Hk2bNo0mTZpUeKxevTo+++yzfT4HAAB7Yo0nACDatm0b+fn58dFHH2W0/84LYe/NmjVrKm1bvXp1ROw6ENubHc/55JNPKv3s//7v/6K4uLjKx6yuefPmRV5eXgwcODAiIubOnRubNm2Kxx9/vHzNp4iIV199NeNj/va3v40mTZrE/PnzKwRmc+fOrbTvgAEDYsCAAVFWVhYvv/xy/PKXv4xLL700OnToEKNGjYri4uIoKiqKxYsX7/J37TwKDgAgDUY8AQBRWFgYgwYNikcffbTGR8Fs3Lgx5s2bV2Hbww8/HI0aNSoPbHYsZJ3JiKDjjz8+CgsL48EHH6yw/aOPPoolS5bEKaecUkOV79k999wTixYtitGjR5cvAr4jkNt5Ye4kSWLWrFmVnr/ziLOd5eXlRePGjSssEF9aWhoPPPDAbmvJz8+P4447rnxk1Z///OeIiDjzzDNj3bp1UVZWVmlkXL9+/eLQQw/daz0AAPvCiCcAqMPeeOONSt9qF/HPaViZrNW0sxtvvDFOPPHEOO644+KKK66Igw46KNasWRPz5s2LO++8s9qjY4qKiuKiiy6KDz/8MA455JBYuHBhzJo1Ky666KLywKZVq1bRrVu3eOKJJ+KUU06Jtm3bRnFxcXTv3r3S8dq0aRNXX311TJ48OcaOHRujR4+OdevWxbRp06JZs2YxZcqUatW5O6WlpbF8+fLy//7ggw9i7ty5MX/+/Bg0aFDccccd5fsOGTIkmjZtGqNHj45JkybFV199Fbfffnts2LCh0nF79+4djz/+eNx+++3Rt2/faNSoUfTr1y+GDRsWN954Y4wZMyYmTJgQ69ati5///OeVvmXujjvuiCVLlsSwYcOia9eu8dVXX5V/a943v/nNiIgYNWpUPPTQQzF06NCYOHFiHHvssdGkSZP46KOP4tlnn40RI0bEyJEjy+v57W9/G4888kgceOCB0axZs+jdu3eNnksAoOERPAFAHXb++efvcvusWbNi/PjxVTpWnz594qWXXoopU6bEj3/849i4cWN07NgxTj755GjatGm1a+zYsWPceuut8aMf/Shef/31aNu2bUyePDmmTZtWYb/Zs2fHf//3f8fw4cNjy5Ytce6558a99967y2P++Mc/jvbt28ctt9wSjzzySBQWFsbgwYPj+uuvj4MPPrjate7KBx98EMcff3xERLRo0SI6dOgQxxxzTDz66KNxzjnnRKNG/38Aec+ePeOxxx6Lq666Ks4555woKiqKMWPGxA9/+MM444wzKhx34sSJ8eabb8bkyZPjiy++iCRJIkmSOPnkk+Puu++On/70p3HWWWdF586d48ILL4z27dvHBRdcUP78o446Kp566qmYMmVKrF69Olq2bBlHHHFEzJs3r3yNqPz8/Jg3b17MnDkzHnjggZgxY0Y0btw4unTpEoMGDaoQLE2bNi0++eSTuPDCC2Pjxo3RrVu3KCkpqdFzCQA0PHnJrr6OBQCgBgwePDg+++yzeOONN7JdCgAAWWCNJwAAAABSIXgCAAAAIBWm2gEAAACQCiOeAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVAieAAAAAEiF4AkAAACAVNSr4Gnjxo0xadKkOPXUU6Ndu3aRl5cXU6dOrbTfLbfcEv3794/i4uIoKCiIrl27xqhRo+LNN9+s/aLZq0zbNSJi27ZtceONN0bv3r2jsLAw2rRpEyeccEK8+OKLtVs01fbKK6/E2WefHZ06dYrmzZtHz549Y/r06bF58+Zsl0YGMu2vf/zjH2P8+PHRt2/fKCgoiLy8vCgpKan1eqm+5557LvLy8nb5WL58ebbLI0OZ9tkkSeKWW26Jnj17RkFBQey///5x0UUXxYYNG2q/aPaqKu06a9as6Nu3b+y3335RVFQUgwYNigULFtR+0ezRkiVLYty4cdGzZ89o0aJFdO7cOUaMGBH/8z//U2G/8847b5f35Z49e2apcqpjd+3ofbbuq8rftvVJvQqe1q1bF3fddVds2bIlzj777D3ud8YZZ8Svf/3reOqpp2LatGnxyiuvxHHHHRfvvPNO7RVMRjJt17Kyshg5cmRMnz49Ro8eHYsWLYqHHnooTj/99Ni0aVPtFUy1vfXWW3HCCSdESUlJ3HzzzTF//vwYNWpUeZuS+zLtr88880w8/fTT0bVr1zjhhBNqr0Bq3PXXXx/Lli2r8DjiiCOyXRYZyrTP/uhHP4rLLrssRowYEfPnz48rrrgiHn744RgyZEhs27at9gomI5m265QpU2LChAlx7LHHxmOPPRb33ntvFBQUxJlnnhmPP/547RXMXt1+++1RUlISEydOjIULF8bMmTNj7dq10b9//1iyZEmFfQsLCyvdlx955JEsVU51XH311ZXacNmyZVFcXBydO3eOf//3f892iVRTpvfneiepR7Zv355s3749SZIk+fTTT5OISKZMmZLRc996660kIpKrr746xQqpjkzb9aabbkoaNWqULFu2rJYrpKZceeWVSUQk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hYWF8e6778bMmTNjy5YtVbqJU3v21q7NmzePa6+9NhYtWhSnn356TJ06Nfbbb7/49a9/Ha+99lr87ne/y2b5ZOjSSy+Ns88+O4YMGRKXXXZZFBcXx/Lly2PGjBlx+OGHxxlnnJHtEslAJv31008/jaVLl0ZExOuvv17+vHbt2kW7du1MqawDxowZE127do1+/fpFcXFx/O///m/84he/iDVr1sS9996b7fKogkz67KxZsyLinyOMP//881i0aFHMnj07rr/++vKlC8gte2vXrl27xjnnnBN33XVXFBQUxNChQ2PLli1x3333xQsvvBDXXnutkYs55Be/+EVcc801cfrpp8ewYcMqBYb9+/ePVatWxZgxY2LUqFFx0EEHRV5eXixdujRuvvnm6NWrlxEzddDcuXNj/fr12q6eyeR9t95J6plu3bolEbHLx8qVK5OvvvoqGT9+fHLYYYclLVu2TBo3bpx06dIl+c///M/kzTffzHb57Mbe2nWH119/PRk2bFjSqlWrpFmzZkn//v2TJ598MnuFU2VLlixJTj311KRjx45JYWFhcsghhySXX3558tlnn2W7NDKUSX999tlnd7vPoEGDslo/mZkxY0Zy1FFHJa1bt07y8/OTdu3aJSNHjkxeeumlbJdGFWXSZ++8887ksMMOS5o3b560bNkyGTBgQDJ37tzsFs4eZdKupaWlyQ033JAceeSRSatWrZK2bdsm/fv3Tx588MFk+/bt2X0BVDBo0KDdtueOP+nWr1+fjBw5MunevXtSWFiYNG3aNDn44IOTSZMmJZ9//nmWXwHVMWTIkKRFixbJl19+me1SqEGZ/m1bn+Qlyb8WYwAAAACAGmSNJwAAAABSIXgCAAAAIBWCJwAAAABSIXgCAAAAIBWCJwAAAABSIXgCAAAAIBWNM93x/fffT7MOqqBHjx41diztmju0a/1Uk+0aoW1ziT5bP2nX+km71k/eY+svfbZ+0q71UybtasQTAAAAAKkQPAEAAACQCsETAAAAAKkQPAEAAACQCsETAAAAAKkQPAEAAACQCsETAAAAAKkQPAEAAACQCsETAAAAAKkQPAEAAACQisbZLgAAdufzzz/f7c/atGlTa3VQe/bU5nviegAAyE1GPAEAAACQCsETAAAAAKkw1Q6AjFV3GlQaaqMW07cyl0vXBgBArmtIn2WNeAIAAAAg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",
      "text/plain": [
       "<Figure size 1500x300 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Decription Dataset 前十张图片及标签：\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1500x300 with 10 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def show_images(dataset, title):\n",
    "    plt.figure(figsize=(15, 3))\n",
    "    for i in range(10):\n",
    "        img, label = dataset[i]\n",
    "        plt.subplot(1, 10, i+1)\n",
    "        plt.imshow(img.numpy(), cmap='gray', vmin=0, vmax=1)\n",
    "        plt.title(str(label))\n",
    "        plt.axis('off')\n",
    "    plt.suptitle(title)\n",
    "    plt.show()\n",
    "\n",
    "print(\"Initial Dataset 前十张图片及标签：\")\n",
    "show_images(initial_dataset, \"Initial Dataset\")\n",
    "\n",
    "print(\"Encription Dataset 前十张图片及标签：\")\n",
    "show_images(encription_dataset, \"Encription Dataset\")\n",
    "\n",
    "print(\"Decription Dataset 前十张图片及标签：\")\n",
    "show_images(decription_dataset, \"Decription Dataset\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "30b946d3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "encription_dataset 第一张图片的张量：\n",
      "tensor([[0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000,\n",
      "         0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000,\n",
      "         0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000,\n",
      "         0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000,\n",
      "         0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8000,\n",
      "         0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627,\n",
      "         0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8000,\n",
      "         0.8000, 0.8000, 0.8000, 0.8627, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000,\n",
      "         0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000,\n",
      "         0.8000, 0.8000, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000, 0.8000,\n",
      "         0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8627, 0.8000,\n",
      "         0.8000, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8000,\n",
      "         0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8000, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8000, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627],\n",
      "        [0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627, 0.8627,\n",
      "         0.8627]])\n",
      "对应标签： 13\n"
     ]
    }
   ],
   "source": [
    "img_enc, label = encription_dataset[0]\n",
    "print(\"encription_dataset 第一张图片的张量：\")\n",
    "print(img_enc)\n",
    "print(\"对应标签：\", label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "04b0ee91",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "e:\\Users\\ASUS\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 28784 (\\N{CJK UNIFIED IDEOGRAPH-7070}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "e:\\Users\\ASUS\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 24230 (\\N{CJK UNIFIED IDEOGRAPH-5EA6}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "e:\\Users\\ASUS\\anaconda3\\Lib\\site-packages\\IPython\\core\\pylabtools.py:170: UserWarning: Glyph 20540 (\\N{CJK UNIFIED IDEOGRAPH-503C}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeQAAAD7CAYAAAC7WecDAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAADfpJREFUeJzt3W9s1dX9wPFP+dMWaaGlZNqKMHAYiEBQIrgwtwRlfx5MgQWyJ2ZjIj5YxvwTE50kxrh/DnVxe2K6MCCCskyHhkDkz4rZg4EJIFMUEtE45qZBihEa0Fk8vweGK7WlJYvCx19fr6QhOffcc8834fDuvbe9VJVSSgAA59WA870BAECQASAFQQaABAQZABIQZABIQJABIAFBBoAEBBkAEhBkAEhAkAEgAUHuwb59+6KhoaHXr1dfffUzn9eX3//+9zFhwoSoqamJsWPHxn333RcffvjhWV3TgQMH4sYbb4zRo0fHkCFD4tJLL43bb7892tvbu80tpcSKFSti+vTpMXTo0Bg2bFhceeWV8cwzz1TmvPXWW7F06dL46le/GiNHjoxhw4bFtGnTorW1NU6ePNllvR/+8IdRVVV1xq8dO3ac1TXA56m/n/vXX3895s2bFw0NDVFXVxezZ8+O3bt397ju2rVrY+rUqVFbWxstLS1x6623RkdHR7d5HR0dceutt0ZLS0vU1tbG1KlTY+3atWe1936p0M1LL71UZs6cecbbZ86cWfbt2/eZz+vNz3/+81JVVVXuvvvusm3btvKb3/ymVFdXl5tvvrnP6zl06FBpamoqY8eOLStXrixtbW3loYceKnV1dWXq1Knl5MmTXebfcsstpaamptx1111l69at5dlnny3Lli0rjz/+eGXO+vXryyWXXFLuueeesmHDhrJ58+Zy2223lQEDBpSFCxd2We/AgQNl+/bt3b5GjhxZLr744tLZ2dnnNcDnrT+f+0OHDpWWlpZy+eWXl6eeeqps2LChfO1rXyv19fVl//79XdZdvXp1iYiyaNGi0tbWVh599NEyfPjwMnv27G57mD17dmloaCiPPvpoaWtrK4sWLSoRUdasWdPn/vsjQe5BtoN5+PDhUltbWxYvXtxl/Be/+EWpqqoqL7/8ci9XU8of/vCHEhFl69atXcZ/+ctflogou3fvroytW7euRET505/+1OuaR44cKf/973+7jf/4xz8uEVEOHjzY6/2fe+65EhFl6dKlvc6Dc6U/n/s777yzDB48uLzxxhuVsffee6+MHDmyLFiwoDLW2dlZmpubyze/+c0ua65Zs6ZERNm4cWNlbMOGDSUiunwjX8rHkW5pafGNeA+8ZP0F8Oyzz8b7778fCxcu7DK+cOHCKKXE008/3ev9Bw8eHBERw4cP7zLe0NAQERG1tbWVsUceeSS+/OUvx4IFC3pds7GxsbLu6aZPnx4REW+++Wav91++fHlUVVXFj370o17nQX91Ls/9unXrYtasWTFmzJjK2LBhw2LevHmxfv366OzsjIiIHTt2xFtvvdVtT/Pnz4+6urpYt25dlzXr6upi/vz53fb/n//8J55//vle998fCfIXwN69eyMiYvLkyV3Gm5ubY+TIkZXbz2TOnDkxevTouOOOO+Lll1+Ojo6O+Nvf/ha//vWv47vf/W5MnDgxIiI6Oztj+/btccUVV8TDDz8cY8aMiYEDB8a4cePiwQcfjHIW/1NnW1tbDBo0KC677LIzznnvvffiySefjGuvvTbGjh3b55rQH52rc3/ixIl47bXXYsqUKd3WmDJlSpw4cSJef/31Lnv69NzBgwfHhAkTuuxp7969MXHixBg0aFC3NU9fi08I8hdAe3t71NTUxNChQ7vdNmLEiB5/QON0w4cPjx07dsSHH34YkyZNivr6+vjGN74RM2bMiD//+c+VeYcPH44PPvgg/vrXv8Zvf/vbuP/++2PLli3xrW99K+68885YunRpr4+zefPmeOyxx+InP/lJNDU1nXHeE088ESdOnIibbrqpjyuH/utcnft33303SikxYsSIHh/n1F5O//NMc0/fU3t7+1mtyScG9T2FDKqqqv6n2yI+PnA33HBDHD9+PNasWROXXHJJ7N27N+6///64/vrrY8OGDTFo0KD46KOPIiLi6NGjsWnTprj66qsjImLWrFnx9ttvx8MPPxx333131NXVdXuM3bt3x4IFC+Lqq6+OX/3qV73uZ/ny5dHU1BRz587t67KhXzsX5/5/eawzzT3beWez//5IkL8Ampqa4v3334/jx4/HBRdc0OW2I0eOxLRp03q9/wMPPBB79uyJf/7zn9Hc3BwREddcc01MmDAhZs2aFWvWrIkf/OAH0djYGFVVVVFfX1+J8Snf+c534umnn45XXnml8j7xKS+88ELMnj07xo8fHxs3boyampoz7uXFF1+MnTt3xk9/+tNe50F/d67PfU/PWI8cORIRnzyrPfXKV3t7e1x44YXd5p7+jLipqems1uQTXrL+Ajj1HtJLL73UZfztt9+Ow4cPx6RJk3q9/549e+Liiy+uHMpTrrrqqoj45L2cIUOGxPjx43tc49T7xwMGdP0r88ILL8R1110XY8aMic2bN3f7AZJPW758eURELFq0qNd50N+dy3P/la98pdvjnHrsIUOGxLhx43rdU2dnZ+zfv7/LniZPnhz79u2r/EDY6WtGRJ/7748E+Qvg29/+dtTW1sbKlSu7jK9cuTKqqqpizpw5vd6/paUl3nzzzfj3v//dZXz79u0RETFq1KjK2Pe+9704evRo/P3vf+8yd+PGjVFXVxeXX355ZWzPnj1x3XXXxahRo2LLli3R2NjY6z4++OCDWL16dUyfPt1hhD6cy3M/d+7caGtri3/961+VsWPHjsVf/vKXuP766ysvbc+YMSOam5u77enJJ5+Mjo6OmDdvXpc1Ozo64qmnnuoyd9WqVdHS0hIzZszodf/90nn9pauksv0+YimffEDAz372s/Lcc8+VZcuWlZqamm4fELBq1aoycODAsmrVqsrYzp07S3V1dZk4cWJZtWpVaWtrK7/73e/Kl770pXLhhReWd955pzK3vb29jB49urS0tJTly5eXTZs2lZtvvrlERHnwwQcr8/bv31+amprKiBEjyvr167t96MehQ4e6XcPatWtLRJTW1tZerxXOh/587g8dOlSam5vL5MmTy7p168rGjRvL17/+9VJfX99tj4899liJiLJ48eKybdu20traWhoaGs74wSCNjY2ltbW1tLW1Vf4tWb16da/X3V8Jcg8yHsxSSnnkkUfKZZddVqqrq8vo0aPLvffe2+3DOVasWFEioqxYsaLL+O7du8vcuXPLqFGjSk1NTRk3blxZtGhRjx/gcfDgwfL973+/NDY2lurq6jJlypTyxz/+scfHOdPXpx+/lI8P59ChQ8vRo0f7vFY41/r7uT9w4ECZM2dOGTZsWLngggvKtddeW3bt2tXjnh5//PEyZcqUUl1dXS666KKyZMmScuzYsW7zjh07VpYsWVIuuuiiyr8lTzzxRJ/X3F8Jcg+yHkzg8+Pcc755DxkAEvBrTz0YOHBg/OMf/6h8xNynnTx5MgYMGPCZzwPOH+ee862qlLP4PEQA4HPl2zMASECQASABQQaABM76h7pee+21z3Mf0K9ceuml53sLZ2XXrl3newvw/0Zfnz/uGTIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACQgyACQgCADQAKCDAAJCDIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkEBVKaWc700AQH/nGTIAJCDIAJCAIANAAoIMAAkIMgAkIMgAkIAgA0ACggwACQgyACTwf3BR0lmv0YiOAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 600x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "block1 = np.full((28, 28), 0.8627, dtype=np.float32)\n",
    "block2 = np.full((28, 28), 0.8000, dtype=np.float32)\n",
    "\n",
    "plt.figure(figsize=(6, 3))\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.imshow(block1, cmap='gray', vmin=0, vmax=1)\n",
    "plt.title('灰度值 0.8627')\n",
    "plt.axis('off')\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.imshow(block2, cmap='gray', vmin=0, vmax=1)\n",
    "plt.title('灰度值 0.8000')\n",
    "plt.axis('off')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "84546236",
   "metadata": {},
   "source": [
    "Change the dataset in function 'shuffle_dataset' to prepare different dataset.\n",
    "\n",
    "    There are three datasets,which are initial_dataset, encription_dataset and decription_dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "efddcb76",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集样本数： 49920\n",
      "验证集样本数： 12480\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "def shuffle_dataset(dataset):\n",
    "    # 打乱数据\n",
    "    random.shuffle(dataset)\n",
    "\n",
    "    # 分割\n",
    "    split_idx = int(0.8 * len(dataset))\n",
    "    train = dataset[:split_idx]\n",
    "    val = dataset[split_idx:]\n",
    "    return train, val\n",
    "\n",
    "\n",
    "\n",
    "train_dataset, val_dataset = shuffle_dataset(decription_dataset)\n",
    "print(\"训练集样本数：\", len(train_dataset))\n",
    "print(\"验证集样本数：\", len(val_dataset))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "a6cd6bc8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "标签最大值： 25\n",
      "标签最小值： 0\n"
     ]
    }
   ],
   "source": [
    "print(\"标签最大值：\", train_labels.max().item())\n",
    "print(\"标签最小值：\", train_labels.min().item())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a20f8c60",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ[\"CUDA_LAUNCH_BLOCKING\"] = \"1\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "2fa687b0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1: Train Loss=0.5753, Train Acc=0.8139, Val Loss=0.2856, Val Acc=0.9018\n",
      "Epoch 2: Train Loss=0.2516, Train Acc=0.9114, Val Loss=0.2551, Val Acc=0.9135\n",
      "Epoch 3: Train Loss=0.1964, Train Acc=0.9294, Val Loss=0.2411, Val Acc=0.9188\n",
      "Epoch 4: Train Loss=0.1623, Train Acc=0.9381, Val Loss=0.2309, Val Acc=0.9232\n",
      "Epoch 5: Train Loss=0.1365, Train Acc=0.9467, Val Loss=0.2408, Val Acc=0.9243\n",
      "Epoch 6: Train Loss=0.1187, Train Acc=0.9530, Val Loss=0.2633, Val Acc=0.9169\n",
      "Epoch 7: Train Loss=0.1039, Train Acc=0.9579, Val Loss=0.2649, Val Acc=0.9225\n",
      "Epoch 8: Train Loss=0.0958, Train Acc=0.9605, Val Loss=0.2796, Val Acc=0.9205\n",
      "Epoch 9: Train Loss=0.0857, Train Acc=0.9638, Val Loss=0.3051, Val Acc=0.9207\n",
      "Epoch 10: Train Loss=0.0784, Train Acc=0.9673, Val Loss=0.3264, Val Acc=0.9223\n",
      "Epoch 11: Train Loss=0.0735, Train Acc=0.9694, Val Loss=0.3342, Val Acc=0.9211\n",
      "Epoch 12: Train Loss=0.0655, Train Acc=0.9721, Val Loss=0.3527, Val Acc=0.9187\n",
      "Epoch 13: Train Loss=0.0621, Train Acc=0.9741, Val Loss=0.3579, Val Acc=0.9197\n",
      "Epoch 14: Train Loss=0.0581, Train Acc=0.9754, Val Loss=0.4046, Val Acc=0.9227\n",
      "Epoch 15: Train Loss=0.0544, Train Acc=0.9777, Val Loss=0.4041, Val Acc=0.9198\n",
      "Epoch 16: Train Loss=0.0479, Train Acc=0.9803, Val Loss=0.4426, Val Acc=0.9156\n",
      "Epoch 17: Train Loss=0.0466, Train Acc=0.9809, Val Loss=0.4560, Val Acc=0.9175\n",
      "Epoch 18: Train Loss=0.0426, Train Acc=0.9824, Val Loss=0.4834, Val Acc=0.9167\n",
      "Epoch 19: Train Loss=0.0397, Train Acc=0.9839, Val Loss=0.4724, Val Acc=0.9206\n",
      "Epoch 20: Train Loss=0.0362, Train Acc=0.9853, Val Loss=0.5029, Val Acc=0.9163\n",
      "Epoch 21: Train Loss=0.0359, Train Acc=0.9861, Val Loss=0.5246, Val Acc=0.9185\n",
      "Epoch 22: Train Loss=0.0291, Train Acc=0.9884, Val Loss=0.5279, Val Acc=0.9140\n",
      "Epoch 23: Train Loss=0.0310, Train Acc=0.9878, Val Loss=0.5265, Val Acc=0.9162\n",
      "Epoch 24: Train Loss=0.0277, Train Acc=0.9894, Val Loss=0.5927, Val Acc=0.9149\n",
      "Epoch 25: Train Loss=0.0241, Train Acc=0.9911, Val Loss=0.6040, Val Acc=0.9125\n",
      "Epoch 26: Train Loss=0.0237, Train Acc=0.9913, Val Loss=0.6250, Val Acc=0.9144\n",
      "Epoch 27: Train Loss=0.0242, Train Acc=0.9914, Val Loss=0.6936, Val Acc=0.9079\n",
      "Epoch 28: Train Loss=0.0207, Train Acc=0.9928, Val Loss=0.6574, Val Acc=0.9170\n",
      "Epoch 29: Train Loss=0.0201, Train Acc=0.9932, Val Loss=0.7511, Val Acc=0.9141\n",
      "Epoch 30: Train Loss=0.0228, Train Acc=0.9921, Val Loss=0.6784, Val Acc=0.9112\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 35757 (\\N{CJK UNIFIED IDEOGRAPH-8BAD}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n",
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 32451 (\\N{CJK UNIFIED IDEOGRAPH-7EC3}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n",
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 39564 (\\N{CJK UNIFIED IDEOGRAPH-9A8C}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n",
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 35777 (\\N{CJK UNIFIED IDEOGRAPH-8BC1}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n",
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 20934 (\\N{CJK UNIFIED IDEOGRAPH-51C6}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n",
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 30830 (\\N{CJK UNIFIED IDEOGRAPH-786E}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n",
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 29575 (\\N{CJK UNIFIED IDEOGRAPH-7387}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n",
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 26354 (\\N{CJK UNIFIED IDEOGRAPH-66F2}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n",
      "C:\\Users\\ASUS\\AppData\\Local\\Temp\\ipykernel_6984\\199753737.py:107: UserWarning: Glyph 32447 (\\N{CJK UNIFIED IDEOGRAPH-7EBF}) missing from font(s) DejaVu Sans.\n",
      "  plt.pause(0.01)\n"
     ]
    },
    {
     "data": {
      "image/png": "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Sy1btkwzZ87UnDlzlJubqxEjRmjMmDHKy8s743ZFRUWaOHGiRo0a1UY1BQAAHcU5f/3CuRg6dKgGDx6s+fPne8v69eunsWPHau7cuU1uN378ePXp00c2m01//vOftW3btma/J31uAADoeNqsz825qK6u1tatW5Wdne1Tnp2drU2bNjW53aJFi/Tll1/q8ccfb9b7VFVVqbi42GcAAADmFbJwc/z4cTmdTiUnJ/uUJycnq6CgoNFt9u7dq5/+9KdasmSJ7PbmPX9w7ty5io+P9w49evQ457oDAID2K6R9biTJYrH4zBuG4VcmSU6nU9/97nf15JNP6qKLLmr268+ePVtFRUXe4eDBg+dcZwAA0H4F9MWZwZSYmCibzebXSlNYWOjXmiNJJSUl2rJli3JzczVt2jRJksvlkmEYstvtev/993Xttdf6bedwOORwOFrnQwAAgHYnZC034eHhGjJkiHJycnzKc3JyNHz4cL/14+LitGPHDm3bts07TJ06VX379tW2bds0dOjQtqo6AABox0LWciNJs2bN0l133aWsrCwNGzZMr7zyivLy8jR16lRJ7ktKhw8f1uuvvy6r1arMzEyf7ZOSkhQREeFXDgAAzl8hDTfjxo3TiRMn9NRTTyk/P1+ZmZlas2aN0tPTJUn5+flnfeYNAABAQyF9zk0o8JwbAAA6ng7xnBsAAIDWQLgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmEvJwM2/ePGVkZCgiIkJDhgzRhg0bmlx35cqVGj16tLp27aq4uDgNGzZM7733XhvWFgAAtHchDTfLli3TzJkzNWfOHOXm5mrEiBEaM2aM8vLyGl1//fr1Gj16tNasWaOtW7fqmmuu0be+9S3l5ua2cc0BAEB7ZTEMwwjVmw8dOlSDBw/W/PnzvWX9+vXT2LFjNXfu3Ga9xiWXXKJx48bpsccea9b6xcXFio+PV1FRkeLi4lpUbwAA0LYCOX+HrOWmurpaW7duVXZ2tk95dna2Nm3a1KzXcLlcKikpUefOnZtcp6qqSsXFxT4DAAAwr5CFm+PHj8vpdCo5OdmnPDk5WQUFBc16jWeffVZlZWW64447mlxn7ty5io+P9w49evQ4p3oDAID2LeQdii0Wi8+8YRh+ZY1566239MQTT2jZsmVKSkpqcr3Zs2erqKjIOxw8ePCc6wwAANove6jeODExUTabza+VprCw0K8153TLli3TlClTtHz5cl133XVnXNfhcMjhcJxzfQEAQMcQspab8PBwDRkyRDk5OT7lOTk5Gj58eJPbvfXWW7r77rv15ptv6qabbmrtagIAgA4mZC03kjRr1izdddddysrK0rBhw/TKK68oLy9PU6dOleS+pHT48GG9/vrrktzBZuLEifrNb36jb37zm95Wn8jISMXHx4fscwAAgPYjpOFm3LhxOnHihJ566inl5+crMzNTa9asUXp6uiQpPz/f55k3v//971VbW6v7779f999/v7d80qRJWrx4cVtXHwAAtEMhfc5NKPCcGwAAOp4O8ZwbAACA1kC4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApmIPdQXaK6fTqZqamlBXAwEICwuTzWYLdTUAACFGuDmNYRgqKCjQqVOnQl0VtEBCQoJSUlJksVhCXRUAQIgQbk5TF2ySkpIUFRXFSbKDMAxD5eXlKiwslCSlpqaGuEYAgFAh3DTgdDq9waZLly6hrg4CFBkZKUkqLCxUUlISl6gA4DxFh+IG6vrYREVFhbgmaKm6nx39pQDg/EW4aQSXojoufnYAAMINmjRy5EjNnDkz1NUAACAghBsTsFgsZxzuvvvuFr3uypUr9X//939BqeOmTZtks9l0ww03BOX1AABoCh2KTSA/P987vWzZMj322GPas2ePt6yuo22dmpoahYWFnfV1O3fuHLQ6Lly4UNOnT9err76qvLw89ezZM2ivDQBAQ7TcmEBKSop3iI+Pl8Vi8c5XVlYqISFBf/rTnzRy5EhFREToj3/8o06cOKE777xT3bt3V1RUlAYMGKC33nrL53VPvyzVq1cv/eIXv9A999yj2NhY9ezZU6+88spZ61dWVqY//elPuvfee3XzzTdr8eLFfuusXr1aWVlZioiIUGJiom699VbvsqqqKv3kJz9Rjx495HA41KdPHy1YsKDF+wsAYG6Em7MwDEPl1bUhGQzDCNrnePjhhzVjxgzt3r1b119/vSorKzVkyBD97W9/03/+8x/98Ic/1F133aWPP/74jK/z7LPPKisrS7m5ubrvvvt077336vPPPz/jNsuWLVPfvn3Vt29fTZgwQYsWLfL5bO+8845uvfVW3XTTTcrNzdUHH3ygrKws7/KJEydq6dKlevHFF7V792797ne/U0xMzLntEACAaXFZ6iwqapzq/9h7IXnvXU9dr6jw4PyIZs6c6dMaIkkPPfSQd3r69Ol69913tXz5cg0dOrTJ17nxxht13333SXIHpueff14ffvihLr744ia3WbBggSZMmCBJuuGGG1RaWqoPPvhA1113nSTp5z//ucaPH68nn3zSu82gQYMkSf/973/1pz/9STk5Od71e/fuHchHBwCcZ2i5OU80bAmR3A8s/PnPf66BAweqS5cuiomJ0fvvv6+8vLwzvs7AgQO903WXv+qeCtyYPXv26N///rfGjx8vSbLb7Ro3bpwWLlzoXWfbtm0aNWpUo9tv27ZNNptNV1999Vk/IwAAEi03ZxUZZtOup64P2XsHS3R0tM/8s88+q+eff14vvPCCBgwYoOjoaM2cOVPV1dVnfJ3TOyJbLBa5XK4m11+wYIFqa2vVrVs3b5lhGAoLC9PXX3+tTp06+XV4buhMywAAaAzh5iwsFkvQLg21Jxs2bNAtt9zivVzkcrm0d+9e9evXL2jvUVtbq9dff13PPvussrOzfZbddtttWrJkiaZNm6aBAwfqgw8+0OTJk/1eY8CAAXK5XFq3bp33shQAAGdivrM2muXCCy/UihUrtGnTJnXq1EnPPfecCgoKghpu/va3v+nrr7/WlClTFB8f77Ps9ttv14IFCzRt2jQ9/vjjGjVqlC644AKNHz9etbW1+vvf/66f/OQn6tWrlyZNmqR77rlHL774ogYNGqQDBw6osLBQd9xxR9DqCgAwD/rcnKceffRRDR48WNdff71GjhyplJQUjR07NqjvsWDBAl133XV+wUZyt9xs27ZNn376qUaOHKnly5dr9erVuvTSS3Xttdf63LU1f/583X777brvvvt08cUX6wc/+IHKysqCWlcAgHlYjGDeb9wBFBcXKz4+XkVFRYqLi/NZVllZqf379ysjI0MREREhqiHOBT9DADCnM52/T0fLDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDbxGjhypmTNnhroaAACcE8KNCXzrW99q8huzN2/eLIvFok8//TRo71dRUaFOnTqpc+fOqqioCNrrAgAQDIQbE5gyZYrWrl2rAwcO+C1buHChLr30Ug0ePDho77dixQplZmaqf//+WrlyZdBeFwCAYCDcmMDNN9+spKQkLV682Ke8vLxcy5Yt05QpU3TixAndeeed6t69u6KiojRgwAC99dZbLXq/BQsWaMKECZowYYIWLFjgt3znzp266aabFBcXp9jYWI0YMUJffvmld/nChQt1ySWXyOFwKDU1VdOmTWtRPQAAaIw91BVo9wxDqikPzXuHRUkWy1lXs9vtmjhxohYvXqzHHntMFs82y5cvV3V1tb73ve+pvLxcQ4YM0cMPP6y4uDi98847uuuuu9S7d28NHTq02VX68ssvtXnzZq1cuVKGYWjmzJnat2+fevfuLUk6fPiwrrrqKo0cOVJr165VXFycNm7cqNraWknS/PnzNWvWLD3zzDMaM2aMioqKtHHjxhbsHAAAGmcxDMMIdSXa0pm+Mr2yslL79+9XRkaGIiIi3IXVZdIv0kJQU0mPHJHCo5u16ueff65+/fpp7dq1uuaaayRJV199tbp166Y333yz0W1uuukm9evXT7/+9a8luTsUX3rppXrhhReafJ85c+Zo165dWrVqlSRp7NixyszM1NNPP+2u8iOPaOnSpdqzZ4/CwsL8tu/WrZsmT57sXT/YGv0ZAgA6vDOdv0/HZSmTuPjiizV8+HAtXLhQkruFZcOGDbrnnnskSU6nUz//+c81cOBAdenSRTExMXr//feVl5fX7PdwOp167bXXNGHCBG/Z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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "from torch.utils.data import DataLoader, TensorDataset\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 记录每个 epoch 的准确率\n",
    "train_acc_list = []\n",
    "val_acc_list = []\n",
    "\n",
    "# 构建模型\n",
    "class SimpleCNN(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(SimpleCNN, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)  # (32,28,28)\n",
    "        self.pool1 = nn.MaxPool2d(2, 2)                         # (32,14,14)\n",
    "        self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) # (64,14,14)\n",
    "        self.pool2 = nn.MaxPool2d(2, 2)                         # (64,7,7)\n",
    "        self.fc1 = nn.Linear(64*7*7, 3136)\n",
    "        self.fc2 = nn.Linear(3136, 128)\n",
    "        self.fc3 = nn.Linear(128, 26)  # 26个类别\n",
    "    def forward(self, x):\n",
    "        x = self.conv1(x)\n",
    "        x = torch.relu(x)\n",
    "        x = self.pool1(x)\n",
    "        x = self.conv2(x)\n",
    "        x = torch.relu(x)\n",
    "        x = self.pool2(x)\n",
    "        x = x.view(x.size(0), -1)\n",
    "        x = torch.relu(self.fc1(x))\n",
    "        x = torch.relu(self.fc2(x))\n",
    "        x = self.fc3(x)\n",
    "        return x\n",
    "\n",
    "# 数据预处理\n",
    "def preprocess(dataset):\n",
    "    imgs = []\n",
    "    labels = []\n",
    "    for img, label in dataset:\n",
    "        imgs.append(img.unsqueeze(0).float())  # (1,28,28)\n",
    "        labels.append(label)\n",
    "    return torch.stack(imgs), torch.tensor(labels)\n",
    "\n",
    "train_imgs, train_labels = preprocess(train_dataset)\n",
    "val_imgs, val_labels = preprocess(val_dataset)\n",
    "\n",
    "train_labels = train_labels.long()\n",
    "val_labels = val_labels.long()\n",
    "\n",
    "train_loader = DataLoader(TensorDataset(train_imgs, train_labels), batch_size=32, shuffle=True)\n",
    "val_loader = DataLoader(TensorDataset(val_imgs, val_labels), batch_size=32)\n",
    "\n",
    "# 训练模型\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "model = SimpleCNN().to(device)\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "\n",
    "#plt.ion()  # 打开交互模式\n",
    "for epoch in range(30):\n",
    "    model.train()\n",
    "    train_loss = 0\n",
    "    correct = 0\n",
    "    for imgs, labels in train_loader:\n",
    "        imgs, labels = imgs.to(device), labels.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        outputs = model(imgs)\n",
    "        loss = criterion(outputs, labels)\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        train_loss += loss.item() * imgs.size(0)\n",
    "        pred = outputs.argmax(dim=1)\n",
    "        correct += (pred == labels).sum().item()\n",
    "    train_acc = correct / len(train_dataset)\n",
    "    train_loss /= len(train_dataset)\n",
    "\n",
    "    # 验证\n",
    "    model.eval()\n",
    "    val_loss = 0\n",
    "    val_correct = 0\n",
    "    with torch.no_grad():\n",
    "        for imgs, labels in val_loader:\n",
    "            imgs, labels = imgs.to(device), labels.to(device)\n",
    "            outputs = model(imgs)\n",
    "            loss = criterion(outputs, labels)\n",
    "            val_loss += loss.item() * imgs.size(0)\n",
    "            pred = outputs.argmax(dim=1)\n",
    "            val_correct += (pred == labels).sum().item()\n",
    "    val_acc = val_correct / len(val_dataset)\n",
    "    val_loss /= len(val_dataset)\n",
    "\n",
    "    train_acc_list.append(train_acc)\n",
    "    val_acc_list.append(val_acc)\n",
    "\n",
    "    print(f\"Epoch {epoch+1}: Train Loss={train_loss:.4f}, Train Acc={train_acc:.4f}, Val Loss={val_loss:.4f}, Val Acc={val_acc:.4f}\")\n",
    "\n",
    "        # 实时绘图\n",
    "plt.clf()\n",
    "plt.plot(range(1, epoch+2), train_acc_list, label='Train Acc')\n",
    "plt.plot(range(1, epoch+2), val_acc_list, label='Val Acc')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.ylim(0, 1)  # 设置纵轴范围为0-1\n",
    "plt.title('训练/验证准确率曲线')\n",
    "plt.legend()\n",
    "plt.pause(0.01)\n",
    "\n",
    "#plt.ioff()  # 关闭交互模式\n",
    "# 训练结束后显示最终曲线\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
